package B3;

import java.util.ArrayList;
import java.util.List;

/**
 * 字符串提取状态机
 * 实现UML状态图逻辑：提取双引号包裹的字符串，处理反斜杠转义（如\"→"）
 */
public class StringExtractorStateMachine {
    // 定义状态枚举（对应状态图的三个核心状态）
    private enum ExtractState {
        INIT,        // 初始状态：未进入字符串
        IN_STRING,   // 字符串内状态：已识别开头双引号，未遇到结束符
        ESCAPE       // 转义状态：识别到反斜杠，需处理下一个字符
    }

    private ExtractState currentState; // 当前状态
    private List<String> extractResult; // 最终提取的字符串列表
    private StringBuilder currentString; // 正在构建的当前字符串

    // 构造方法：初始化状态和容器
    public StringExtractorStateMachine() {
        this.currentState = ExtractState.INIT;
        this.extractResult = new ArrayList<>();
        this.currentString = new StringBuilder();
    }

    /**
     * 核心方法：处理输入文本，提取符合规则的字符串
     * @param input 待解析的原始文本（如源代码字符串）
     * @return 提取出的所有有效字符串列表
     */
    public List<String> extractStrings(String input) {
        // 重置状态（支持多次调用）
        resetState();

        // 逐字符解析，驱动状态转移
        for (char c : input.toCharArray()) {
            switch (currentState) {
                case INIT:
                    // 初始状态：仅识别开头双引号，进入字符串内状态
                    if (c == '"') {
                        currentState = ExtractState.IN_STRING;
                    }
                    // 非双引号字符，无操作
                    break;

                case IN_STRING:
                    if (c == '\\') {
                        // 识别到转义符，进入转义状态
                        currentState = ExtractState.ESCAPE;
                    } else if (c == '"') {
                        // 识别到结束双引号，保存当前字符串并回到初始状态
                        extractResult.add(currentString.toString());
                        currentString.setLength(0); // 清空当前字符串
                        currentState = ExtractState.INIT;
                    } else {
                        // 普通字符，加入当前字符串
                        currentString.append(c);
                    }
                    break;

                case ESCAPE:
                    // 转义状态：直接添加当前字符（忽略反斜杠），回到字符串内状态
                    currentString.append(c);
                    currentState = ExtractState.IN_STRING;
                    break;
            }
        }
        return extractResult;
    }

    /**
     * 重置状态机（用于多次解析不同文本）
     */
    private void resetState() {
        this.currentState = ExtractState.INIT;
        this.extractResult.clear();
        this.currentString.setLength(0);
    }

    /**
     * 获取当前提取结果（辅助方法）
     */
    public List<String> getExtractResult() {
        return extractResult;
    }
}